<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>访问器描述符</title>
</head>
<body>
    
</body>
</html>
<script>

    
    
    //访问器描述符
    // function User(name,age){
    //     //抽象参数
    //     let data = {name:name,age:age};
    //     //定制私有属性
    //     Object.defineProperties(this,{
    //         name:{
    //             get(){
    //                 return data.name;
    //             },
    //             set(value){
    //                 if(value.trim() == "") throw new Error("无效的名称");
    //                 //使用闭包的特性，在当前区域找不到的变量去父级找，直到找到window为止
    //                 data.name = value;
    //             }
    //         },
    //         age:{
    //             get(){
    //                 return data.age;
    //             },
    //             set(value){
    //                 if(typeof value != 'number' || value < 1 || value > 100) throw new Error('年龄错误');
    //                 data.age = value;
    //             }
    //         }
    //     });
    // }

    
    // let hd = new User("后盾人",33);
    // console.log(hd.age);
    // hd.name = '向军1';
    // console.log(hd.name);



    //语法糖===============================================
    "use strict";
    //构造方法  和构造类是一样的
    class User{
        constructor(name,age){
            this.data = {name,age};
        }
        get name(){
            console.log('get name ....');
            return this.data.name;
        }
        set name(value){
            console.log('set name...')
            if(value.trim() == "") {alert("无效的用户名"); return false;}
            this.data.name = value;
        }
        get age(){
            return this.data.age;
        }
        set age(value){
            if(typeof value != 'number' || value < 1 || value > 100) {alert('年龄不合适');return false;}
            this.data.age = value;
        }
    }

    let hd = new User("后盾人",33);
    console.log(hd.name);
    hd.name = 'hdcms';
    console.log(hd.name)
    









</script>